<!DOCTYPE html><html><head><title>MatchVSEngine2.0</title><meta charset='utf-8'><link href='https://dn-maxiang.qbox.me/res-min/themes/marxico.css' rel='stylesheet'><style></style></head><body><div id='preview-contents' class='note-content'>
                        
                    



<h2 id="matchvsengine20">MatchVSEngine2.0</h2>

<p>v2.00.000 <br>
目录:</p>

<div><div class="toc"><div class="toc">
<ul>
<li><ul>
<li><a href="#matchvsengine20">MatchVSEngine2.0</a><ul>
<li><a href="#插件概述">插件概述:</a><ul>
<li><a href="#架构说明配图">架构说明(配图)</a></li>
</ul>
</li>
<li><a href="#名词术语">名词术语</a><ul>
<li><a href="#物品商品">物品&amp;商品</a></li>
<li><a href="#物品商品的作用">物品&amp;商品的作用</a></li>
<li><a href="#场次">场次</a></li>
</ul>
</li>
<li><a href="#api">API</a><ul>
<li><a href="#流程图">流程图</a></li>
<li><a href="#检验">检验</a></li>
<li><a href="#消耗">消耗</a></li>
<li><a href="#兑换">兑换</a></li>
<li><a href="#后台发放商品">后台发放商品</a></li>
<li><a href="#用户信息获取">用户信息获取</a></li>
<li><a href="#用户战况上报">用户战况上报</a></li>
<li><a href="#检查有无此场次">检查有无此场次</a></li>
<li><a href="#检测场次是否可以进入">检测场次是否可以进入</a></li>
<li><a href="#锁住用户物品">锁住用户物品</a></li>
<li><a href="#解锁用户物品">解锁用户物品</a></li>
<li><a href="#进场消费">进场消费</a></li>
<li><a href="#仲裁处理">仲裁处理</a></li>
</ul>
</li>
<li><a href="#demo使用说明">Demo使用说明</a><ul>
<li><a href="#c-插件">C# 插件</a><ul>
<li><a href="#1运行winform服务端demo">1.运行Winform服务端Demo</a></li>
<li><a href="#2运行unity客户端demo">2.运行Unity客户端Demo</a></li>
<li><a href="#3演示api">3.演示API</a></li>
<li><a href="#4其他说明">4.其他说明</a></li>
</ul>
</li>
<li><a href="#c-插件-1">C++ 插件</a></li>
<li><a href="#运行环境">运行环境</a></li>
</ul>
</li>
<li><a href="#服务搭建">服务搭建</a><ul>
<li><a href="#matchvs-核心服务插件接入">MatchVS 核心服务插件接入</a><ul>
<li><a href="#1-依赖组件">1. 依赖组件</a></li>
<li><a href="#linux平台">linux平台</a></li>
<li><a href="#windows平台">windows平台</a></li>
<li><a href="#2-配置">2. 配置</a></li>
<li><a href="#3-使用服务">3. 使用服务</a></li>
<li><a href="#4-房间管理">4. 房间管理</a></li>
<li><a href="#5-用户管理">5. 用户管理</a></li>
</ul>
</li>
<li><a href="#matchvs-标准化服务插件接入">MatchVS 标准化服务插件接入</a><ul>
<li><a href="#依赖组件">依赖组件</a></li>
<li><a href="#配置无">配置（无）</a></li>
<li><a href="#使用服务">使用服务</a></li>
<li><a href="#添加依赖组件">添加依赖组件</a></li>
<li><a href="#初始化组件">初始化组件</a></li>
<li><a href="#场次类接口">场次类接口</a></li>
<li><a href="#商品管理接口">商品管理接口</a></li>
<li><a href="#用户及仲裁">用户及仲裁</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#调试">调试</a><ul>
<li><a href="#日志">日志</a></li>
<li><a href="#客户端与服务端调试">客户端与服务端调试</a></li>
</ul>
</li>
<li><a href="#插件使用实践举例">插件使用实践举例</a><ul>
<li><a href="#游戏体力消耗和赠送">游戏体力消耗和赠送</a></li>
<li><a href="#天梯分近值匹配">天梯分近值匹配</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>

<hr>



<h3 id="插件概述">插件概述:</h3>

<ul><li>MatchvsSDK在客户端提供对战通信的能力，在服务端插件中为开发者提供一整套的标准化服务的能力，包含游戏产品需要的拓展功能、运营功能等。</li>
<li>每个功能在插件中独立模块，即插即用，开发者只需要完成自身产品游戏版本的内容，其他可以通过MatchVS SDK快速接入使用，为开发者节约大量成本和时间。</li>
<li>对于有更多个性化功能需求的开发者，MatchVS开放各功能API，开发者可以在服务端插件中自行实现后端逻辑，快速自定制满意功能。</li>
<li>matchvs需配置功能提供后台配置，开发者登陆matchvs官网-管理中心即可使用。对于开发者的个性化，MatchVS提供了CP server 后台模板，开发者可以直接套用。</li>
</ul>



<h4 id="架构说明配图">架构说明(配图)</h4>



<p><img longdesc="./cp Server---.jpg" alt="Alt text" title="" type="image/jpeg" src="" class=""></p>



<h3 id="名词术语">名词术语</h3>



<h4 id="物品商品">物品&amp;商品</h4>

<p>物品（product）：游戏中单个可通过系统消耗或兑换的可自定义名称的基础道具，如金币、钻石、道具等。 <br>
商品（goods）：商品可被赋予包含单个或多个物品，如商城RMB兑换钻石包，钻石包可包含赋予的物品钻石和额外赠送的其他物品。</p>



<p><img longdesc="./Goods.png" alt="Alt text" title="" type="image/png" src="" class=""></p>



<h4 id="物品商品的作用">物品&amp;商品的作用</h4>

<p>可用于游戏中交易、流通，商城购买、兑换，系统产出、回收，奖励发放等，实际中开发者可根据自己的游戏逻辑灵活使用。</p>



<h4 id="场次">场次</h4>

<p>可应用于游戏中有多种玩法的情况 <br>
如：炉石传说拥有休闲和天梯两种模式的玩法，斗地主有1000分场、10000分场，通过matchvs后台配置2个场次，自定义场次名称和ID，指定用户只能进入指定ID场次中</p>



<h3 id="api">API</h3>



<h4 id="流程图">流程图</h4>



<p><img longdesc="./BattleFollowChart.png" alt="Alt text" title="" type="image/png" src="" class=""></p>



<h4 id="检验">检验</h4>

<p>cpAuth <br>
登陆时将会对服务端插件校验，authTme一定要大于上次请求的时间</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>gameID</td>
  <td>游戏ID</td>
</tr>
<tr>
  <td>authTime</td>
  <td>当前时间</td>
</tr>
<tr>
  <td>sign</td>
  <td>签名</td>
</tr>
</tbody></table>


<p>authTime一定要大于上次请求的时间</p>



<h4 id="消耗">消耗</h4>

<p>spend <br>
物品&amp;商品在系统中流通或被系统回收的过程，即为消耗 <br>
举例：A玩家进入X房间对战一局，系统扣除房间费用，同时A用户输掉了该局，付出输掉费用给B用户，这个过程即为消耗</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>gameID</td>
  <td>游戏ID</td>
</tr>
<tr>
  <td>userID</td>
  <td>用户ID</td>
</tr>
<tr>
  <td>goodsID</td>
  <td>商品ID</td>
</tr>
<tr>
  <td>payload</td>
  <td>备注</td>
</tr>
<tr>
  <td>sign</td>
  <td>签名</td>
</tr>
</tbody></table>




<h4 id="兑换">兑换</h4>

<p>exchange <br>
物品&amp;商品在系统中互相交易的过程，即为兑换 <br>
举例：A用户在商城使用钻石兑换金币，A用户用钻石交易B用户的道具</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>gameID</td>
  <td>游戏ID</td>
</tr>
<tr>
  <td>userID</td>
  <td>用户ID</td>
</tr>
<tr>
  <td>goodsID</td>
  <td>商品ID</td>
</tr>
<tr>
  <td>payload</td>
  <td>备注</td>
</tr>
</tbody></table>




<h4 id="后台发放商品">后台发放商品</h4>

<p>sendGoods <br>
Matchvs提供配置商品后台，开发者自定义ID等属性，使用商品时直接调用对应商品ID</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>gameID</td>
  <td>游戏ID</td>
</tr>
<tr>
  <td>userID</td>
  <td>用户ID</td>
</tr>
<tr>
  <td>goodsID</td>
  <td>商品ID</td>
</tr>
<tr>
  <td>payload</td>
  <td>备注</td>
</tr>
</tbody></table>




<h4 id="用户信息获取">用户信息获取</h4>

<p>getUsersInfo <br>
用户信息获取 <br>
调用getUserInfo API，matchvs可返回单个&amp;批量用户信息，包含用户ID、昵称、头像</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>gameID</td>
  <td>游戏ID</td>
</tr>
<tr>
  <td>userIDList</td>
  <td>用户列表,用逗号隔开</td>
</tr>
</tbody></table>


<p>返回</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>users</td>
  <td>用户列表 json列表</td>
</tr>
</tbody></table>


<p>users:</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>userID</td>
  <td>用户ID</td>
</tr>
<tr>
  <td>nickName</td>
  <td>用户昵称</td>
</tr>
<tr>
  <td>avatar</td>
  <td>头像</td>
</tr>
</tbody></table>




<h4 id="用户战况上报">用户战况上报</h4>

<p>battleRecord <br>
字段scoreA、B、C对应胜利、失败、平局次数，开发者通过对应接口上报，服务端做累加储存，并返回值，对于有更多数据需要储存的情况，可通过字段extend_0-9上报，（累加、取大、取小）何种方式储存，由开发者自定义 <br>
注：字段储存值，可用于排行榜、战绩数据、经验信息等多种地方</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>gameID</td>
  <td>游戏ID</td>
</tr>
<tr>
  <td>roomID</td>
  <td>房间ID</td>
</tr>
<tr>
  <td>roundID</td>
  <td>局ID</td>
</tr>
<tr>
  <td>scores</td>
  <td>上报信息列表 json</td>
</tr>
</tbody></table>


<p>scores:</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>userID</td>
  <td>用户ID</td>
</tr>
<tr>
  <td>score a</td>
  <td>信息A</td>
</tr>
<tr>
  <td>score b</td>
  <td>信息B</td>
</tr>
<tr>
  <td>score c</td>
  <td>信息C</td>
</tr>
<tr>
  <td>extend</td>
  <td>数组</td>
</tr>
</tbody></table>


<p>8.获取用户商品信息 <br>
getProductsInfo <br>
调用接口getProductInfo，通过gameID+userID获取用户所有物品信息 <br>
如：查询A用户拥有金币10000个，钻石10000，其他道具若干</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>gameID</td>
  <td>游戏ID</td>
</tr>
<tr>
  <td>userID</td>
  <td>用户ID</td>
</tr>
</tbody></table>


<p>返回</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>productID</td>
  <td>商品ID</td>
</tr>
<tr>
  <td>productName</td>
  <td>商品名称</td>
</tr>
<tr>
  <td>gameID</td>
  <td>游戏ID</td>
</tr>
<tr>
  <td>count</td>
  <td>个数</td>
</tr>
<tr>
  <td>lockCount</td>
  <td>已锁个数</td>
</tr>
</tbody></table>




<h4 id="检查有无此场次">检查有无此场次</h4>

<p>checkField</p>

<p>调用checkField，根据gameID、versionGame、fieldID查看返回结果</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>gameID</td>
  <td>游戏ID</td>
</tr>
<tr>
  <td>versionGame</td>
  <td>游戏版本</td>
</tr>
<tr>
  <td>fieldID</td>
  <td>场次ID</td>
</tr>
</tbody></table>


<p>有场次返回:   status 0 <br>
无场次返回：  status 1</p>



<h4 id="检测场次是否可以进入">检测场次是否可以进入</h4>

<p>checkUserField</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>gameID</td>
  <td>游戏ID</td>
</tr>
<tr>
  <td>userID</td>
  <td>用户ID</td>
</tr>
<tr>
  <td>fieldID</td>
  <td>场次ID</td>
</tr>
</tbody></table>


<p>返回： <br>
可以进入                status    0 <br>
不可以进入               status   1   code</p>



<h4 id="锁住用户物品">锁住用户物品</h4>

<p>lockUserField <br>
当开发者需要用户进入场次时付出部分物品，由系统回收或对战双方的输赢扣费，在用户进场时调用lockUserUserField，锁住对应物品 <br>
举例：斗地主某场次每场打完，系统会扣除200欢乐豆，用户输扣除1000欢乐豆，赢奖励1000欢乐豆，则在战斗前，调用锁住用户物品接口，锁定校验用户是否有满足需求的豆豆，并返回对应结果</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>gameID</td>
  <td>游戏ID</td>
</tr>
<tr>
  <td>userID</td>
  <td>用户ID</td>
</tr>
<tr>
  <td>fieldID</td>
  <td>场次ID</td>
</tr>
</tbody></table>


<p>返回： <br>
成功 status    0 data包含  lockID, gameID <br>
失败 status    1 code</p>



<h4 id="解锁用户物品">解锁用户物品</h4>

<p>unLockUserField <br>
用户战斗结束后，解锁该部分用户物品用于系统回收或返还给用户</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>gameID</td>
  <td>游戏ID</td>
</tr>
<tr>
  <td>userID</td>
  <td>用户ID</td>
</tr>
<tr>
  <td>fieldID</td>
  <td>场次ID</td>
</tr>
<tr>
  <td>lockID</td>
  <td>锁ID</td>
</tr>
</tbody></table>


<p>返回： <br>
成功  status    0 <br>
失败  status   1   code</p>



<h4 id="进场消费">进场消费</h4>

<p>spendUserField <br>
开发者调用该API可自定义在进入战斗开始，任意时段扣除用户的物品</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>gameID</td>
  <td>游戏ID</td>
</tr>
<tr>
  <td>userID</td>
  <td>用户ID</td>
</tr>
<tr>
  <td>fieldID</td>
  <td>场次ID</td>
</tr>
<tr>
  <td>lockID</td>
  <td>锁ID</td>
</tr>
</tbody></table>


<p>返回： <br>
成功  status    0 <br>
失败  status   1   code</p>



<h4 id="仲裁处理">仲裁处理</h4>

<p>dealUserField</p>

<table>
<thead>
<tr>
  <th>参数</th>
  <th>含义</th>
</tr>
</thead>
<tbody><tr>
  <td>gameID</td>
  <td>游戏ID</td>
</tr>
<tr>
  <td>userID</td>
  <td>用户ID</td>
</tr>
<tr>
  <td>fieldID</td>
  <td>场次ID</td>
</tr>
<tr>
  <td>userCount</td>
  <td>用户数</td>
</tr>
<tr>
  <td>state</td>
  <td>结果 1 胜 2 负 3平</td>
</tr>
</tbody></table>


<p>返回： <br>
成功  status   0 <br>
失败  status   1   code</p>



<h3 id="demo使用说明">Demo使用说明</h3>



<h4 id="c-插件">C# 插件</h4>



<h5 id="1运行winform服务端demo">1.运行Winform服务端Demo</h5>

<p><a href="http://fastres.matchvs.com/MatchVSSDK_Unity_v1.3.0.0.zip" target="_blank">下载Unity3D客户端Demo</a> <br>
使用Visual Studio编辑器运行其中的VS工程</p>



<p><img longdesc="./1474269861465.png" alt="Alt text" title="" type="image/png" src="" class=""></p>



<h5 id="2运行unity客户端demo">2.运行Unity客户端Demo</h5>

<p><a href="http://fastres.matchvs.com/MatchVSSDK_Unity_v1.3.0.0.zip" target="_blank">下载Unity3D客户端Demo</a> <br>
使用Unity3D编辑器运行其中的Unity工程</p>



<p><img longdesc="./1472718824109.png" alt="Alt text" title="" type="image/png" src="" class=""></p>



<h5 id="3演示api">3.演示API</h5>

<p>点击客户端的登录按钮 <br>
服务端将会收到消息.并操作相关按钮来 <strong>允许/禁止</strong> 客户端登录 <br>
其他API类似</p>



<h5 id="4其他说明">4.其他说明</h5>



<h4 id="c-插件-1">C++ 插件</h4>

<p>MatchVS提供了后台服务插件集合（以动态库的形式），包括<strong>核心服务插件</strong>和<strong>标准化服务插件</strong>。 游戏开发者使用<strong>MatchVS</strong>后台插件服务，可以将服务程序关联MatchVS后端引擎整合起来，实现游戏后台逻辑的高度可定制化。</p>



<h4 id="运行环境">运行环境</h4>

<p><strong>MatchVS 2.0</strong>当前支持Linux/Unix，Windows平台。</p>



<h3 id="服务搭建">服务搭建</h3>

<ol><li rel="1">游戏申请注册 <br>
可到<strong><a href="http://cn.matchvs.com/" target="_blank">MatchVS官网</a></strong>注册，或咨询客服、商务渠道。</li>
<li rel="2">游戏服务器主机选择 <br>
windows可选择当前开发机器（或MatchVS云主机）当做服务器，方便调试； <br>
linux、Unix可选择本地开发机器或MatchVS云主机。</li>
<li rel="3">构建游戏服务程序 <br>
游戏开发者基于<strong>MatchVS引擎插件</strong>编写服务端处理程序，添加核心服务处理逻辑，包括用户管理、房间管理、物品管理、场次控制等，详细部分请参考<strong>插件接入</strong>。</li>
</ol>



<h4 id="matchvs-核心服务插件接入">MatchVS 核心服务插件接入</h4>

<p><strong>MatchVS</strong> 自<strong>2.0</strong>后，后台核心新版本提供了更加通用、可拓展的接口，引入了SDK和后台配合使用的游戏插件接入服务，使得CP能够高度定制化后台服务器，包括用户的管理，房间的管理，消息分发等。</p>



<h5 id="1-依赖组件">1. 依赖组件</h5>



<h5 id="linux平台">linux平台</h5>

<ul><li>C/C++ ： libmatchvs.so，matchvs.h</li>
</ul>



<h5 id="windows平台">windows平台</h5>

<ul><li>C/C++ ： matchvs.dll，matchvs.h</li>
</ul>



<ul><li>C#:  matchvsplugin.dll</li>
<li></li>
</ul>



<h5 id="2-配置">2. 配置</h5>

<p>使用核心服务插件首先需要进行配置，主要分为4个部分，即：<strong>MatchVS</strong>基础配置，服务器进程相关配置，插件服务目录配置，<strong>MatchVS</strong>核心服务配置。其中插件服务目录配置为定制的运行目录，<strong>MatchVS</strong>核心服务配置则需要根据<strong><em>游戏注册信息进行配置</em></strong>，并保证正确。 <br>
配置实例如下：</p>



<pre class="prettyprint hljs-dark"><code class="hljs cpp"><span class="hljs-preprocessor">#matchvs插件服务配置文件</span><br><span class="hljs-preprocessor"># --- <span class="hljs-number">1.</span> matchvs基础配置 [must] （不要修改） ---</span><br>event.reserve=<span class="hljs-number">1024</span><br>conn.reserve=<span class="hljs-number">1024</span><br>conn.life.time=<span class="hljs-number">200</span><br>not.daemon=<span class="hljs-number">1</span><br>not.check.token=<span class="hljs-number">1</span><br>worker.process.id=<span class="hljs-number">10</span><br>worker.process.num=<span class="hljs-number">1</span><br>server.listen.wait.num=<span class="hljs-number">1024</span><br>server.listen.mode=<span class="hljs-number">1</span><br>cpu.affinity=<span class="hljs-number">1</span><br>debug.level=<span class="hljs-number">0</span><br>server.tcp.ip=<span class="hljs-number">0.0</span><span class="hljs-number">.0</span><span class="hljs-number">.0</span><br>server.tcp.port=<span class="hljs-number">10006</span><br>server.in.tcp.ip=<span class="hljs-number">0.0</span><span class="hljs-number">.0</span><span class="hljs-number">.0</span><br>server.in.tcp.port=<span class="hljs-number">10006</span><br>server.in.udp.ip=<span class="hljs-number">0.0</span><span class="hljs-number">.0</span><span class="hljs-number">.0</span><br>server.in.udp.port=<span class="hljs-number">10006</span><br><br><span class="hljs-preprocessor"># --- <span class="hljs-number">2.</span> 服务器进程相关配置 [must]（请区分linux，windows进行配置） ---</span><br><span class="hljs-preprocessor">#服务锁</span><br>worker.process.lock=E:\lock\service1.lock<br><span class="hljs-preprocessor">#服务进程ID文件</span><br>worker.process.pid=E:\pid\service1.pid<br><br><span class="hljs-preprocessor">#  ---  <span class="hljs-number">3.</span> 插件服务目录配置[must] （请区分linux，windows进行配置）   ---</span><br><span class="hljs-preprocessor">#工作目录,win下需要手动创建</span><br>working.directory=E:\<br><span class="hljs-preprocessor">#日志目录,win下需要手动创建</span><br>working.<span class="hljs-built_in">log</span>.directory=E:\<span class="hljs-built_in">log</span><br><br><span class="hljs-preprocessor">#  --- <span class="hljs-number">4.</span> matchvs核心服务配置 [must]（注册matchvs引擎服务提供） ---</span><br><span class="hljs-preprocessor">#接入服务器</span><br>matchvs.access.ip.<span class="hljs-keyword">default</span>=<span class="hljs-number">123.59</span><span class="hljs-number">.43</span><span class="hljs-number">.221</span><br><span class="hljs-preprocessor">#接入服务端口</span><br>matchvs.access.port.<span class="hljs-keyword">default</span>=<span class="hljs-number">10004</span><br><span class="hljs-preprocessor">#游戏插件服务器ID</span><br>server.id=<span class="hljs-number">8</span><br><span class="hljs-preprocessor">#matchvs引擎服务集群ID</span><br>ha.id=<span class="hljs-number">12</span><br><span class="hljs-preprocessor">#心跳间隔 （建议<span class="hljs-number">10</span>s）</span><br>matchvs.access.heartbeat.interval.sec=<span class="hljs-number">10</span><br><span class="hljs-preprocessor">#游戏ID</span><br>matchvs.game.id=<span class="hljs-number">102000</span><br><span class="hljs-preprocessor">#游戏token</span><br>matchvs.token=<span class="hljs-number">1111</span>c06fc81d4d15b748233cedc61111<br></code></pre>



<h5 id="3-使用服务">3. 使用服务</h5>

<p>使用核心服务插件首先需要初始化和注册回调监听接口，初始化完成后，即可以进行业务监听回调，后台服务管理等。 <br>
初始化代码如下： <br>
C/C++ <br>
首先实现回调接口方法，即游戏用户、房间、游戏状态等回调，如下：</p>



<pre class="prettyprint hljs-dark"><code class="hljs dart"><span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 游戏CP回调接口集合 *</span>/</span></span><br><span class="hljs-literal">typedef</span>  struct matchvs_callback_s<br>{<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 初始化回调 *</span>/</span></span><br>        <span class="hljs-keyword">void</span>(FunStackPushType *on_inited)(<span class="hljs-built_in">int</span> ret, <span class="hljs-keyword">const</span> char *msg);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 异常回掉 *</span>/</span></span><br>        <span class="hljs-keyword">void</span>(FunStackPushType *on_exception)(<span class="hljs-built_in">int</span> ret, <span class="hljs-keyword">const</span> char *msg);<br><br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 用户登录回调 *</span>/</span></span><br>        <span class="hljs-keyword">void</span>(FunStackPushType *on_user_logined)(<span class="hljs-built_in">int</span> user_id);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 用户登出回调 *</span>/</span></span><br>        <span class="hljs-keyword">void</span>(FunStackPushType *on_user_logouted)(<span class="hljs-built_in">int</span> user_id);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 创建房间回调 *</span>/</span></span><br>        <span class="hljs-keyword">void</span>(FunStackPushType *on_room_created)(<span class="hljs-built_in">int</span> room_id, char *room_name, <span class="hljs-built_in">int</span> max_user, <span class="hljs-built_in">int</span> could_random, <span class="hljs-keyword">void</span> *payload, <span class="hljs-built_in">int</span> payload_size, <span class="hljs-built_in">int</span> first_user);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 销毁房间回调 *</span>/</span></span><br>        <span class="hljs-keyword">void</span>(FunStackPushType *on_room_released)(<span class="hljs-built_in">int</span> room_id);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 用户加入房间回调 *</span>/</span></span><br>        <span class="hljs-keyword">void</span>(FunStackPushType *on_user_joined_room)(<span class="hljs-built_in">int</span> user_id, <span class="hljs-built_in">int</span> room_id, char *payload, <span class="hljs-built_in">int</span> payload_size);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 用户离开房间回调 *</span>/</span></span><br>        <span class="hljs-keyword">void</span>(FunStackPushType *on_user_leaved_room)(<span class="hljs-built_in">int</span> user_id, <span class="hljs-built_in">int</span> room_id);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 用户请求加入随机房间回调 *</span>/</span></span><br>        <span class="hljs-built_in">int</span>(FunStackPushType *on_user_want_join_random_room)(<span class="hljs-built_in">int</span> user_id, <span class="hljs-keyword">void</span> *payload, <span class="hljs-built_in">int</span> payload_size);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 用户请求加入指定房间回调 *</span>/</span></span><br>        <span class="hljs-built_in">int</span>(FunStackPushType *on_user_want_join_room)(<span class="hljs-built_in">int</span> user_id, <span class="hljs-built_in">int</span> room_id, <span class="hljs-keyword">void</span> *payload, <span class="hljs-built_in">int</span> payload_size);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 用户请求创建房间回调 *</span>/</span></span><br>        <span class="hljs-built_in">int</span>(FunStackPushType *on_user_want_create_room)(<span class="hljs-built_in">int</span> user_id, <span class="hljs-built_in">int</span> max_user, <span class="hljs-built_in">int</span> could_random, <span class="hljs-built_in">int</span> *name_size, char *name_buf, <span class="hljs-built_in">int</span> name_buf_size, <span class="hljs-keyword">void</span> *payload, <span class="hljs-built_in">int</span> payload_size);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 用户请求游戏准备回调 *</span>/</span></span><br>        <span class="hljs-built_in">int</span>(FunStackPushType *on_user_want_ready_game)(<span class="hljs-built_in">int</span> user_id, <span class="hljs-built_in">int</span> room_id);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 用户请求游戏开始回调 *</span>/</span></span><br>        <span class="hljs-built_in">int</span>(FunStackPushType *on_user_want_start_game)(<span class="hljs-built_in">int</span> user_id, <span class="hljs-built_in">int</span> room_id);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 用户准备游戏回调 *</span>/</span></span><br>        <span class="hljs-keyword">void</span>(FunStackPushType *on_user_readyed_game)(<span class="hljs-built_in">int</span> user_id, <span class="hljs-built_in">int</span> room_id);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 用户游戏结束回调 *</span>/</span></span><br>        <span class="hljs-keyword">void</span>(FunStackPushType *on_user_overed_game)(<span class="hljs-built_in">int</span> user_id, <span class="hljs-built_in">int</span> room_id, matchvs_score_t *score, <span class="hljs-keyword">void</span>* paylod, <span class="hljs-built_in">int</span> payload_size);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 用户取消准备游戏回调 *</span>/</span></span><br>        <span class="hljs-keyword">void</span>(FunStackPushType *on_user_cancel_readyed_game)(<span class="hljs-built_in">int</span> user_id, <span class="hljs-built_in">int</span> room_id);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 游戏开始通知下发（通知所有用户） *</span>/</span></span><br>        <span class="hljs-keyword">void</span>(FunStackPushType *on_game_started)(<span class="hljs-built_in">int</span> room_id, <span class="hljs-built_in">int</span> round_id);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 游戏结束通知下发（通知所有用户） *</span>/</span></span><br>        <span class="hljs-keyword">void</span>(FunStackPushType *on_game_overed)(<span class="hljs-built_in">int</span> room_id, <span class="hljs-built_in">int</span> round_id);<br>        <span class="hljs-comment"><span class="markdown">/<span class="hljs-emphasis">** @brief 接收到用户数据中转 （抓发给其他用户） *</span>/</span></span><br>        <span class="hljs-built_in">int</span> (FunStackPushType *on_msg_recved)(<span class="hljs-built_in">int</span> user_id, <span class="hljs-built_in">int</span> des_count, <span class="hljs-built_in">int</span> *users, <span class="hljs-built_in">int</span> event_id, <span class="hljs-built_in">int</span> buf_size, char *buf);<br>}matchvs_callback_t;<br></code></pre>

<p>将函数指针绑定到<code>matchvs_callback_t</code>结构对象的成员函数指针，然后调用初始化接口，如下代码：</p>



<pre class="prettyprint hljs-dark"><code class="hljs cpp"><span class="hljs-preprocessor">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;matchvs.h&gt;</span></span><br><br><span class="hljs-comment">//定义回调函数实现</span><br><span class="hljs-comment">//如初始化回调</span><br><span class="hljs-function"><span class="hljs-keyword">void</span> FunStackPushType <span class="hljs-title">on_inited_callback</span><span class="hljs-params">(<span class="hljs-keyword">int</span> ret, <span class="hljs-keyword">const</span> <span class="hljs-keyword">char</span> *msg)</span></span>;<br>...<br><br><span class="hljs-comment">/** 初始化 */</span><br><span class="hljs-keyword">matchvs_callback_t</span> callbacks;<br>callbacks.on_inited = on_inted_callback;<br><span class="hljs-comment">//其他回调接口绑定</span><br><span class="hljs-comment">///...</span><br><span class="hljs-keyword">if</span>(<span class="hljs-number">0</span> =! matchvs_init(&amp;callback))<br>{<br>    <span class="hljs-built_in">printf</span>(<span class="hljs-string">"init matchvs failed"</span>);<br>    <span class="hljs-keyword">return</span> -<span class="hljs-number">1</span>;<br>}<br><span class="hljs-built_in">printf</span>(<span class="hljs-string">"init matchvs success"</span>);<br></code></pre>

<p>初始化成功则调用<code>on_inited</code>绑定的回调函数，如以上代码即<code>on_inited_callback</code>。 <br>
 注意在初始化C#与C++略有不同: </p>



<pre class="prettyprint hljs-dark"><code class="hljs swift"><span class="hljs-comment">//初始化</span><br><span class="hljs-type">MatchVSEngine</span>.getInstance().<span class="hljs-keyword">init</span>();<br><span class="hljs-comment">//实现 Listener 接口并注册</span><br><span class="hljs-type">MatchVSEngine</span>.getInstance().addListener(<span class="hljs-type">Listener</span> listener);<br></code></pre>



<h5 id="4-房间管理">4. 房间管理</h5>

<p>核心插件服务提供房间(类似游戏组会话)类的多个接口，实现对房间资源的管理，包括：创建房间，设置房间最大人数，房间开关等，对于房间拓展属性，如场次管理等则在<strong>标准化服务插件</strong>中处理，如下： <br>
 C/C++</p>



<pre class="prettyprint hljs-dark"><code class="hljs aspectj"><span class="hljs-comment">/** <span class="hljs-doctag">@brief</span> 创建房间并绑定房主（后台主动） */</span><br><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">matchvs_create_room</span><span class="hljs-params">(<span class="hljs-keyword">int</span> name_size, <span class="hljs-keyword">char</span> *name, <span class="hljs-keyword">int</span> max_user, <span class="hljs-keyword">int</span> could_random, <span class="hljs-keyword">void</span> *payload, <span class="hljs-keyword">int</span> payload_size, <span class="hljs-keyword">int</span> first_user)</span></span>;<br><span class="hljs-comment">/** <span class="hljs-doctag">@brief</span> 关闭加入指定房间开关（后台主动） */</span><br><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">matchvs_close_room_in</span><span class="hljs-params">(<span class="hljs-keyword">int</span> room_id)</span></span>;<br><span class="hljs-comment">/** <span class="hljs-doctag">@brief</span> 打开加入指定房间开关（后台主动） */</span><br><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">matchvs_open_room_in</span><span class="hljs-params">(<span class="hljs-keyword">int</span> room_id)</span></span>;<br><span class="hljs-comment">/** <span class="hljs-doctag">@brief</span> 设置房间最大用户个数（后台主动） */</span><br><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">matchvs_set_room_max</span><span class="hljs-params">(<span class="hljs-keyword">int</span> room_id, <span class="hljs-keyword">int</span> num)</span></span>;<br><span class="hljs-comment">/** <span class="hljs-doctag">@brief</span> 设置游戏开始（后台主动） */</span><br><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">matchvs_start_game</span><span class="hljs-params">(<span class="hljs-keyword">int</span> room_id)</span></span>;<br><span class="hljs-comment">/** <span class="hljs-doctag">@brief</span> 结束指定房间游戏局（后台主动） */</span><br><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">matchvs_over_game</span><span class="hljs-params">(<span class="hljs-keyword">int</span> room_id)</span></span>;<br></code></pre>



<h5 id="5-用户管理">5. 用户管理</h5>

<p>游戏服务需要对用户的状态、用户进入房间、游戏局等进行管理，用户管理类接口提供了实现添加用户到指定房间、踢掉用户以及更新用户状态等，如下：</p>



<pre class="prettyprint hljs-dark"><code class="hljs aspectj"><span class="hljs-comment">/** <span class="hljs-doctag">@brief</span> 将用户加入到房间（后台主动） */</span><br><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">matchvs_user_join_room</span><span class="hljs-params">(<span class="hljs-keyword">int</span> room_id, <span class="hljs-keyword">int</span> user_id)</span></span>;<br><span class="hljs-comment">/** <span class="hljs-doctag">@brief</span> 将用户踢出房间（后台主动） */</span><br><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">matchvs_user_leave_room</span><span class="hljs-params">(<span class="hljs-keyword">int</span> room_id, <span class="hljs-keyword">int</span> user_id)</span></span>;<br><span class="hljs-comment">/** <span class="hljs-doctag">@brief</span> 设置用户游戏准备（后台主动） */</span><br><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">matchvs_user_ready_game</span><span class="hljs-params">(<span class="hljs-keyword">int</span> room_id, <span class="hljs-keyword">int</span> user_id)</span></span>;<br><span class="hljs-comment">/** <span class="hljs-doctag">@brief</span> 设置用户游戏取消准备（后台主动） */</span><br><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">matchvs_user_cancel_ready_game</span><span class="hljs-params">(<span class="hljs-keyword">int</span> room_id, <span class="hljs-keyword">int</span> user_id)</span></span>;<br><span class="hljs-comment">/** <span class="hljs-doctag">@brief</span> 结束指定房间游戏局（后台主动） */</span><br><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">matchvs_over_game</span><span class="hljs-params">(<span class="hljs-keyword">int</span> room_id)</span></span>;<br></code></pre>



<h4 id="matchvs-标准化服务插件接入">MatchVS 标准化服务插件接入</h4>

<p><strong>MatchVS</strong> 自<strong>2.0</strong>后，引入了标准化运营类服务接口，包括对应场次和物品等的支持，提供了包括用户场类管理接口、用户仲裁奖励接口、商品管理接口等， 使得游戏开发者能够实现拓展服务，丰富游戏逻辑，减少开发量。标准化服务插件接口，在完成初始化后， 其他接口都是无状态接口，可以根据需要自由调用。</p>



<h5 id="依赖组件">依赖组件</h5>

<ul><li>linux平台：libmatchvsextension.so，mvs.h</li>
<li>windows平台：matchvsextension.dll，mvs.h</li>
<li>windows平台C#： matchvsextensioncsharp.dll …. </li>
</ul>



<h5 id="配置无">配置（无）</h5>



<h5 id="使用服务">使用服务</h5>

<p>使用标准化服务插件需要加入依赖组件，完成初始化操作。初始化作为其他标准化接口调用的前提。 <br>
步骤如下：</p>



<h5 id="添加依赖组件">添加依赖组件</h5>

<p>对应平台（windows，linux）添加依赖组件中的头文件和库文件。</p>



<h5 id="初始化组件">初始化组件</h5>

<p>分为初始化和认证两步： <br>
<strong>C/C++</strong></p>



<pre class="prettyprint hljs-dark"><code class="hljs cpp"><span class="hljs-comment">//包含头文件</span><br><span class="hljs-preprocessor">#<span class="hljs-keyword">include</span> <span class="hljs-string">&lt;mvs.h&gt;</span></span><br><span class="hljs-comment">//定义回调接口实现</span><br><span class="hljs-comment">//如认证auth回调接口实现</span><br><span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">mvs_auth_callback</span><span class="hljs-params">(<span class="hljs-keyword">void</span> *user_data, <span class="hljs-keyword">int</span> status, <span class="hljs-keyword">const</span> <span class="hljs-keyword">char</span> *msg)</span><br></span>{<br><span class="hljs-comment">//definetion code</span><br><span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br>}<br><br><span class="hljs-keyword">mvs_callback_t</span> callbacks;<br>callbacks.mvs_auth_back = mvs_auth_callback;<br>...<br><br><span class="hljs-comment">//1. 初始化</span><br>mvs_init(&amp;callbacks);<br><span class="hljs-comment">//2. auth认证</span><br>mvs_auth(<span class="hljs-literal">NULL</span>);<br></code></pre>



<h5 id="场次类接口">场次类接口</h5>

<p>标准化服务插件能够提供场次查询，锁定，检查等，接口如下： <br>
 C/C++</p>



<pre class="prettyprint hljs-dark"><code class="hljs gherkin">/<span class="hljs-keyword">*</span><span class="hljs-keyword">*</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@brief 检查场次是否存在 （必须先初始化和认证）</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param filed_id 场次ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param game_id 游戏ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param game_version 游戏版本</span><br>    <span class="hljs-keyword">*</span>/<br>    int mvs_check_field_exist(int field_id, int game_id, int game_version, void <span class="hljs-keyword">*</span>user_data);<br><br>    /<span class="hljs-keyword">*</span><span class="hljs-keyword">*</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@brief 检查场次是否可以进入 （必须先初始化和认证）</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param filed_id 场次ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param game_id 游戏ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_id 用户ID</span><br>    <span class="hljs-keyword">*</span>/<br>    int mvs_check_user_field(int field_id, int game_id, int user_id, void <span class="hljs-keyword">*</span>user_data);<br><br>    /<span class="hljs-keyword">*</span><span class="hljs-keyword">*</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@brief 锁定用户场次（锁定商品） （必须先初始化和认证）</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param filed_id 场次ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param game_id 游戏ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_id 用户ID</span><br>    <span class="hljs-keyword">*</span>/<br>    int mvs_lock_user_field(int field_id, int game_id, int user_id, void <span class="hljs-keyword">*</span>user_data);<br><br>    /<span class="hljs-keyword">*</span><span class="hljs-keyword">*</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@brief 解锁用户场次（解锁商品） （必须先初始化和认证）</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param filed_id 场次ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param game_id 游戏ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_id 用户ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param lock_id 锁定ID</span><br>    <span class="hljs-keyword">*</span>/<br>    int mvs_unlock_user_field(int field_id, int game_id, int user_id, int lock_id, void <span class="hljs-keyword">*</span>user_data);<br><br>    /<span class="hljs-keyword">*</span><span class="hljs-keyword">*</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@brief 用户入场消费（消耗商品） （必须先初始化和认证）</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param filed_id 场次ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param game_id 游戏ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_id 用户ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param lock_id 锁定ID</span><br>    <span class="hljs-keyword">*</span>/<br>    int mvs_spend_user_field(int field_id, int game_id, int user_id, int lock_id, void <span class="hljs-keyword">*</span>user_data);<br></code></pre>

<p>C# <br>
c# interface</p>



<h5 id="商品管理接口">商品管理接口</h5>

<p>游戏逻辑需要涉及到各种物品或商品，标准化服务插件能够提供灵活的接口，包括：商品的消耗，商品信息查询，物品兑换等，可以配合核心服务插件使用， 接口如下：</p>



<pre class="prettyprint hljs-dark"><code class="hljs gherkin">/<span class="hljs-keyword">*</span><span class="hljs-keyword">*</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@brief 用户商品消耗（必须先初始化和认证）</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_id 用户ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param goods_id 商品ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param payload 备注信息</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_data 用户私有对象指针</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@return 0: 成功，其他值：失败</span><br>    <span class="hljs-keyword">*</span>/<br>    int mvs_spend(int user_id, int goods_id, char <span class="hljs-keyword">*</span>payload, void <span class="hljs-keyword">*</span>user_data);<br><br>    /<span class="hljs-keyword">*</span><span class="hljs-keyword">*</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@brief 用户商品兑换 （必须先初始化和认证）</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_id 用户ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param goods_id 商品ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param payload 备注信息</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_data 用户私有对象指针</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@return 0: 成功，其他值：失败</span><br>    <span class="hljs-keyword">*</span>/<br>    int mvs_exchange(int user_id, int goods_id, char <span class="hljs-keyword">*</span>payload, void <span class="hljs-keyword">*</span>user_data);<br><br>    /<span class="hljs-keyword">*</span><span class="hljs-keyword">*</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@brief 用户商品发放 （必须先初始化和认证）</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_id 用户ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param goods_id 商品ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param payload 备注信息</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_data 用户私有对象指针</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@return 0: 成功，其他值：失败</span><br>    <span class="hljs-keyword">*</span>/<br>    int mvs_send_good(int user_id, int goods_id, char <span class="hljs-keyword">*</span>payload, void <span class="hljs-keyword">*</span>user_data);<br><br>    /<span class="hljs-keyword">*</span><span class="hljs-keyword">*</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@brief 获取商品信息 （必须先初始化和认证）</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_id 用户ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_data 用户私有对象指针</span><br>    <span class="hljs-keyword">*</span>/<br></code></pre>

<p>C# <br>
c# interface</p>



<h5 id="用户及仲裁">用户及仲裁</h5>

<p>标准化服务插件能够批量获取用户信息，分数上报及仲裁奖励等，接口如下：</p>



<pre class="prettyprint hljs-dark"><code class="hljs gherkin">/<span class="hljs-keyword">*</span><span class="hljs-keyword">*</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@brief 获取用户信息 （必须先初始化和认证）</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_count 用户个数</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_ids 用户ID列表</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_data 用户私有对象指针</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@return 0: 成功，其他值：失败</span><br>    <span class="hljs-keyword">*</span>/<br>    int mvs_get_users_info(int user_count, int user_ids[], void <span class="hljs-keyword">*</span>user_data);<br><br>    /<span class="hljs-keyword">*</span><span class="hljs-keyword">*</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@brief 分数上报 （必须先初始化和认证）</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param score_count 分数个数</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param scores 分数列表</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_data 用户私有对象指针</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@return 0: 成功，其他值：失败</span><br>    <span class="hljs-keyword">*</span>/<br>    int mvs_battle_record(int roomID, int roundID, int score_count, mvs_score_t  <span class="hljs-keyword">*</span>scores, void <span class="hljs-keyword">*</span>user_data);<br>/<span class="hljs-keyword">*</span><span class="hljs-keyword">*</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@brief 用户场次奖励（胜、负、平奖励商品） （必须先初始化和认证）</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param filed_id 场次ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param game_id 游戏ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_id 用户ID</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param user_count 用户个数</span><br>    <span class="hljs-keyword">*</span> <span class="hljs-comment">@param state 胜负状态： 1 胜利，2 负， 3 平局</span><br>    <span class="hljs-keyword">*</span>/<br>    int mvs_deal_user_field(int field_id, int game_id, int user_id, int user_count, int state, void <span class="hljs-keyword">*</span>user_data);<br></code></pre>



<h3 id="调试">调试</h3>



<h4 id="日志">日志</h4>

<p>日志见在worker目录下的matchvs_*.log文件</p>



<h4 id="客户端与服务端调试">客户端与服务端调试</h4>

<ol><li rel="1">配置客户端和服务端检查为相同的gameID</li>
<li rel="2">为客户端配置AppKey</li>
<li rel="3">先初始化服务端,再初始化客户端</li>
<li rel="4">通过日志和GUI界面调试相关接口</li>
</ol>



<h3 id="插件使用实践举例">插件使用实践举例</h3>



<h4 id="游戏体力消耗和赠送">游戏体力消耗和赠送</h4>

<p>开发者A需要在游戏中添加体力及体力在好友间互相赠送的逻辑，并随着等级的提升而增加体力上限，当消耗体力时，随着在线时长恢复体力。</p>

<p>解决方案：通过matchvs后台配置物品：体力ID；字段extend_0上报经验，累加储存。客户端通过体力ID请求玩家B有50点体力，matchvs校验后下发50点体力返回给客户端，用户的总经验由字段extend_0上报，客户端自行根据个性化的等级晋升机制判断当前用户多少级，并再次请求需要获得的体力数量，正值为增加，负值为减少。 <br>
同时客户端可在服务端插件逻辑中，加入用户X与好友Y之间建立通信通道，通过通信通道请求赠送体力给好友。</p>

<p>后台配置:</p>

<ul><li>开发者后台配置一个物品为”体力”</li>
</ul>

<p>使用接口:</p>

<ul><li>用户对战结果监听(对战消耗体力)</li>
<li>用户消息发送监听(监听是否为赠送体力的消息)</li>
<li>用户信息获取(获取自己和好友的体力数量)</li>
<li>后台消费(减少自己的体力)</li>
<li>后台商品发放接口(增加好友的体力)</li>
</ul>



<h4 id="天梯分近值匹配">天梯分近值匹配</h4>

<p>开发者B需要实力更相近的用户匹配至一起，实力判断标准为天梯积分（MMR值）。</p>

<p>解决方案：客户端通过字段extend_1上报用户天梯积分，用户胜利上报正值，用户失败可上报负值，可设定逻辑最低不低于0，服务端（matchvs）累加处理该值，并返回给客户端，客户端得到用户的天梯积分值，可在用户寻求匹配时，设定只有符合与该用户天梯积分相符合的用户才能匹配成功。或将个性化的匹配逻辑通过matchvs开放的API接入服务端插件，让匹配更真实。</p>

<p>后台配置:</p>

<ul><li>开发者后台配置用户属性字段extend_1为变更方式为 累加(加负数即为减)</li>
</ul>

<p>使用接口:</p>

<ul><li>用户加入房间监听(记录玩家匹配请求和时间)</li>
<li>用户信息获取(获取天梯分数)</li>
<li>将用户置于某房间(将天梯分数相近的玩家置于指定房间,达成匹配效果)</li>
</ul></div></body></html>